From 3b08654f6dd3b253dec84f8693b552c53b8d5b7a Mon Sep 17 00:00:00 2001 From: "maf46@burn.cl.cam.ac.uk" Date: Mon, 21 Feb 2005 11:31:57 +0000 Subject: [PATCH] bitkeeper revision 1.1230 (4219c6ad75ERLn-41qrS4GAxcsiIFQ) Pass a struct xen_regs* to shadow_fault() instead of an error_code. --- xen/arch/x86/shadow.c | 8 ++++---- xen/arch/x86/traps.c | 4 ++-- xen/arch/x86/vmx.c | 15 +++++++-------- xen/include/asm-x86/shadow.h | 2 +- 4 files changed, 14 insertions(+), 15 deletions(-) diff --git a/xen/arch/x86/shadow.c b/xen/arch/x86/shadow.c index 294a883141..68243dd511 100644 --- a/xen/arch/x86/shadow.c +++ b/xen/arch/x86/shadow.c @@ -601,13 +601,13 @@ void shadow_invlpg(struct exec_domain *ed, unsigned long va) } } -int shadow_fault(unsigned long va, long error_code) +int shadow_fault(unsigned long va, struct xen_regs *regs) { unsigned long gpte, spte = 0; struct exec_domain *ed = current; struct domain *d = ed->domain; - SH_VVLOG("shadow_fault( va=%p, code=%lu )", va, error_code ); + SH_VVLOG("shadow_fault( va=%p, code=%lu )", va, regs->error_code ); check_pagetable(d, ed->arch.guest_table, "pre-sf"); @@ -628,7 +628,7 @@ int shadow_fault(unsigned long va, long error_code) return 0; } - if ( (error_code & 2) && !(gpte & _PAGE_RW) ) + if ( (regs->error_code & 2) && !(gpte & _PAGE_RW) ) { /* Write fault on a read-only mapping. */ return 0; @@ -656,7 +656,7 @@ int shadow_fault(unsigned long va, long error_code) } /* Write fault? */ - if ( error_code & 2 ) + if ( regs->error_code & 2 ) { if ( unlikely(!(gpte & _PAGE_RW)) ) { diff --git a/xen/arch/x86/traps.c b/xen/arch/x86/traps.c index a2ac58ad0c..26cf436e07 100644 --- a/xen/arch/x86/traps.c +++ b/xen/arch/x86/traps.c @@ -289,7 +289,7 @@ asmlinkage int do_page_fault(struct xen_regs *regs) ptwr_do_page_fault(addr) ) { if ( unlikely(shadow_mode_enabled(d)) ) - (void)shadow_fault(addr, regs->error_code); + (void)shadow_fault(addr, regs); UNLOCK_BIGLOCK(d); return EXCRET_fault_fixed; } @@ -297,7 +297,7 @@ asmlinkage int do_page_fault(struct xen_regs *regs) } if ( unlikely(shadow_mode_enabled(d)) && - (addr < PAGE_OFFSET) && shadow_fault(addr, regs->error_code) ) + (addr < PAGE_OFFSET) && shadow_fault(addr, regs) ) return EXCRET_fault_fixed; if ( unlikely(addr >= LDT_VIRT_START(ed)) && diff --git a/xen/arch/x86/vmx.c b/xen/arch/x86/vmx.c index db5e5140da..a14a145521 100644 --- a/xen/arch/x86/vmx.c +++ b/xen/arch/x86/vmx.c @@ -105,7 +105,7 @@ static void inline __update_guest_eip(unsigned long inst_len) #include -static int vmx_do_page_fault(unsigned long va, unsigned long error_code) +static int vmx_do_page_fault(unsigned long va, struct xen_regs *regs) { unsigned long eip; unsigned long gpa; @@ -115,8 +115,8 @@ static int vmx_do_page_fault(unsigned long va, unsigned long error_code) { __vmread(GUEST_EIP, &eip); VMX_DBG_LOG(DBG_LEVEL_VMMU, - "vmx_do_page_fault = 0x%lx, eip = %lx, erro_code = %lx", - va, eip, error_code); + "vmx_do_page_fault = 0x%lx, eip = %lx, error_code = %lx", + va, eip, regs->error_code); } #endif @@ -137,7 +137,7 @@ static int vmx_do_page_fault(unsigned long va, unsigned long error_code) if (mmio_space(gpa)) handle_mmio(va, gpa); - if ((result = shadow_fault(va, error_code))) + if ((result = shadow_fault(va, regs))) return result; return 0; /* failed to resolve, i.e raise #PG */ @@ -757,7 +757,6 @@ asmlinkage void vmx_vmexit_handler(struct xen_regs regs) int error; unsigned int vector; unsigned long va; - unsigned long error_code; if ((error = __vmread(VM_EXIT_INTR_INFO, &vector)) && !(vector & INTR_INFO_VALID_MASK)) @@ -792,14 +791,14 @@ asmlinkage void vmx_vmexit_handler(struct xen_regs regs) case TRAP_page_fault: { __vmread(EXIT_QUALIFICATION, &va); - __vmread(VM_EXIT_INTR_ERROR_CODE, &error_code); + __vmread(VM_EXIT_INTR_ERROR_CODE, ®s.error_code); VMX_DBG_LOG(DBG_LEVEL_VMMU, "eax=%lx, ebx=%lx, ecx=%lx, edx=%lx, esi=%lx, edi=%lx", regs.eax, regs.ebx, regs.ecx, regs.edx, regs.esi, regs.edi); ed->arch.arch_vmx.vmx_platform.mpci.inst_decoder_regs = ®s; - if (!(error = vmx_do_page_fault(va, error_code))) { + if (!(error = vmx_do_page_fault(va, ®s))) { /* * Inject #PG using Interruption-Information Fields */ @@ -810,7 +809,7 @@ asmlinkage void vmx_vmexit_handler(struct xen_regs regs) INTR_INFO_DELIEVER_CODE_MASK | TRAP_page_fault); __vmwrite(VM_ENTRY_INTR_INFO_FIELD, intr_fields); - __vmwrite(VM_ENTRY_EXCEPTION_ERROR_CODE, error_code); + __vmwrite(VM_ENTRY_EXCEPTION_ERROR_CODE, regs.error_code); ed->arch.arch_vmx.cpu_cr2 = va; } break; diff --git a/xen/include/asm-x86/shadow.h b/xen/include/asm-x86/shadow.h index 251096617c..696ab786a6 100644 --- a/xen/include/asm-x86/shadow.h +++ b/xen/include/asm-x86/shadow.h @@ -38,7 +38,7 @@ extern void shadow_mode_init(void); extern int shadow_mode_control(struct domain *p, dom0_shadow_control_t *sc); -extern int shadow_fault(unsigned long va, long error_code); +extern int shadow_fault(unsigned long va, struct xen_regs *regs); extern void shadow_l1_normal_pt_update( unsigned long pa, unsigned long gpte, unsigned long *prev_spfn_ptr, l1_pgentry_t **prev_spl1e_ptr); -- 2.30.2